package matrix;

/**
 * Интерфейс к области (набору) {@linkplain matrix.ICell Ячеек} (например, матрица, диагональ,строка, колонка,..).
 * <p>Наследует (расширяет) интерфейс {@linkplain matrix.ICell ICell}.
 * Привязка к родительской Области (если свойство {@linkplain matrix.IRange#parent() parent} не равно null):
 * <li> свойство {@linkplain matrix.ICell#row() ICell.row} должно указывать на номер строки родительской области, представляющую собой первую (верхнюю?) строку данной подобласти.
 * <li> свойство {@linkplain matrix.ICell#column() ICell.column} должно указывать на номер столбца родительской области, представляющую собой первый (левый?) столбец данной подобласти.
 */
public interface IRange extends ICell {
	/**
	 * Возвращает родительскую {@linkplain matrix.IRange Область}, содержащую данную область
	 * @return {@linkplain matrix.IRange IRange}
	 */
	abstract IRange parent();
	/**
	 * Возвращает укзазанную {@linkplain matrix.IRange строку}
	 * @param aRow int - номер строки
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий строку. 
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li>aRow меньше 1 или
	 * <li>aRow больше {@linkplain matrix.IRange#rows() rows()}
	 */
	abstract IRange row(int aRow);
	/**
	 * Возвращает укзазанный {@linkplain matrix.IRange столбец}
	 * @param aColumn int - номер столбца
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий столбец
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li>aColumn меньше 1 или
	 * <li>aColumn больше {@linkplain matrix.IRange#columns() columns()}
	 */
	abstract IRange column(int aColumn);
	/**
	 * Возвращает количество строк области ячеек 
	 * @return количество строк
	 */
	abstract int rows();
	/**
	 * Возвращает количество столбцов области ячеек 
	 * @return количество столбцов
	 */
	abstract int columns();
	/**
	 * Возвращает область ячеек (подобласть) внутри данной (родительской) области, заданную:
	 * <li>координатами привязки - aRow, aColumn и
	 * <li>размерами - aRows, aColumns.
	 * @param tRow первая (верхняя?) строка родительской {@linkplain matrix.IRange Области}.
	 * @param lColumn первая (левая?) колонка родительской {@linkplain matrix.IRange Области}
	 * @param aRows - количество строк в выделяемой области
	 * @param aColumns - количество столбцов в выделяемой области 
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий выделенную область ячеек. 
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li>tRow или lColumn меньше 1 или
	 * <li>tRow+aRows больше {@linkplain matrix.IRange#rows() rows()} или
	 * <li>lColumn+aColumns больше {@linkplain matrix.IRange#columns() columns()}
	 * @see matrix.IRange#rows()
	 * @see matrix.IRange#columns()
	 */
	abstract IRange range(int tRow, int lColumn, int aRows, int aColumns);
	/**
	 * Возвращает одну ячеку внутри данной области, заданную строкой и колонкой
	 * @param aRow строка. Не может быть меньше 1 и больше {@linkplain matrix.IRange#rows() rows()} данной области
	 * @param aColumn колонка. Не может быть меньше 1 и больше {@linkplain matrix.IRange#columns() columns()} данной области
	 * @return  объект {@linkplain matrix.ICell ICell}, представляющий собой одну ячейку
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li>aRow меньше 1 или больше {@linkplain matrix.IRange#rows() rows()}.    
	 * <li>aColumn меньше 1 или больше {@linkplain matrix.IRange#columns() columns()}.    
	 * @see matrix.IRange#rows()
	 * @see matrix.IRange#columns()
	 */
	abstract ICell cell(int aRow, int aColumn);
	
}
